使用MDK 自带逻辑分析仪显示任意波形
我在之前的微文中有提到基于MDK自带逻辑分析仪输出波形的信息。发现有人对使用MDK自带逻辑分析仪实现波形输出比较感兴趣。下面使用STM32F334的DAC模块,输出一任意波形,并通过ARM MDK IDE自带的逻辑分析仪将波形显示出来。我尽量就整个过程描述得详细点。
我这里使用TIM6的更新事件触发DMA,让DMA将我事先准备好的内存数据传输到DAC通道1数据保持寄存器【DAC1->DHR12R1】。然后,我在TIM6的中断里将DAC数据输出寄存器【DOR】的内容读到一个全局变量【DAC_Out】,将来作为逻辑分析仪里的一个模拟量并输出该信号。
同时,我将DAC的输出端接到ADC1模块的通道1作为其输入,将DAC过来的信号进行AD转换,并通过DMA将ADC结果存放到另一个内存空间。我利用TIM3更新事件周期性触发ADC,并在TIM3更新中断里将最新ADC数据赋给另一个全局变量【ADC_Res】,作为MDK_IDE逻辑分析仪的另外一路模拟量,也将输出其波形。
一、下面开始使用STM32CubeMx做图形化配置
1、DAC的配置如下。配置很简单,只是开启了DAC通道1的输出使能,至于输出缓冲可根据具体情况来配置,这里将其使能了。
2、配置TIM6。主要是使用它的更新事件触发DMA,将数据从内存传输到DAC的寄存器。
3、ADC的配置。这里仅开启一个通道,TIM3更新事件作为ADC启动触发事件。ADC转换完成事件触发DMA传输,将ADC结果取走。
4、TIM3的配置。它的配置也很简单,给定适当时基参数,使能更新中断。
外设配置主要就上面这些,其它有关DMA、RCC的配置就不再贴图了。
二、配置完成后,生成初始化文件,然后添加用户代码
1、数据准备。因为要借助DAC输出一任意波形,可以先借助其它工具模拟一下输出波形。最便捷的就是使用EXCEL的数学函数功能模拟相关波形。这里使用几个三角函数叠加而成一个新的函数。基于该函数生成一个数据序列用于DAC输出。
2、添加用户代码。
要添加的用户代码就是下面几行,意思都很明确了,无须过多解释。其中length是宏定义过的一个常量,代表数据个数。下面代码基于STM32Cube库。
3、中断函数处理。
在TIM6的更新中断里加入如下代码,实时获取DAC输出数据。
DAC_Out= DAC1->DOR1;
在TIM3的更新中断里加入如下代码,实时读取ADC结果。
ADC_Res=(uint16_t)Adc_Value[Length-DMA1_Channel1->CNDTR];
三、针对MDK逻辑分析仪的配置
这里提醒下,那个Core_clock一定要跟你芯片配置的系统时钟一致。另外Trace Enable一定要勾选上。联机进入调试状态后,继续进行对逻辑分析仪的配置。下图中的红色数字1/2/3表示操作顺序。
点击箭头处添加我们之前准备好的全局变量并做适当配置。这里添加的两个变量都是模拟量,所以显示类型选Analog,显示颜色根据个人喜好。注意模拟量有最值的设定问题,太大、太小都不合适,这个不难理解。屏蔽处的配置根据要显示的数据范围来指定,本实验数据不会超过0xfff,所以就按图中配置了。
四、查看结果
下面的第一幅截图就是通过MDK自带的逻辑分析仪输出的两路波形。红色曲线是DAC输出的波形图,蓝色曲线是ADC转换后得到的实时结果波形图。
不难看出,两路波形是一致的周期性输出,但ADC的输出与DAC的输出存在相差,因为ADC的结果是对DAC输出进行采样转换后所得的结果,所以时序上存在滞后。第二幅图是调整时间观测宽度后的截图。
好,关于用MDK自带逻辑分析仪进行任意波形的输出就介绍到这里,顺便也简单介绍了STM32 ADC/DAC的一些配置与应用。
关于MDK自带的这个工具,如果会用了,有时还是会给我们的调试带来些方便。使用起来不难,有兴趣的话不妨试试。
================================
往期话题链接【点击即可阅读】: